6 #ifndef _CFEXPTOPOLOGIEKDTREE_H_ 7 #define _CFEXPTOPOLOGIEKDTREE_H_ 19 template<
typename TValue>
40 template<
typename TValue>
44 #if !COORD_OPTIMIZATION_IS_ON 48 _coordinates.get()[idx] = 0;
53 template<
typename TValue>
57 #if !COORD_OPTIMIZATION_IS_ON 63 _coordinates.get()[idx] = coordinates.get()[idx];
65 _coordinates = coordinates;
70 template<
typename TValue>
76 if (length1 != length2)
80 size_t idx; TValue dist = 0;
87 template<
typename TValue>
91 size_t length1 = _coordinates.GetArrLength();
93 if (length1 != length2)
101 if (CFEXPBaseConvers::Compare<TValue>(
115 template<
typename TData,
typename TValue,
typename Enable =
void>
119 template<
typename TValue,
typename TData>
122 <TData, TValue, typename std::enable_if<std::is_base_of<ICFEXPFECoordinatesBase<TValue>, TData>::value>::type>
126 : _data(data), _hpnd(hyp_node), _left(nullptr), _rght(nullptr) { }
145 collect_tree_nodes.push_back(new_tree_node);
146 result = new_tree_node.get();
148 else if ((*hyp_nd) == (*node->_hpnd))
152 collect_tree_nodes.push_back(new_tree_node);
153 result->_same_nodes_data.push_back(new_tree_node.get());
156 else if (hyp_nd->
_coordinates.get()[level] > node->_hpnd->_coordinates.get()[level])
157 result->_rght = InsertNode(hyp_nd, result->_rght, data, (level + 1) % dim, dim, collect_tree_nodes);
159 result->_left = InsertNode(hyp_nd, result->_left, data, (level + 1) % dim, dim, collect_tree_nodes);
170 if (lower->
_coordinates.get()[level] <= node->_hpnd->_coordinates.get()[level])
171 SearchRange(lower, upper, node->_left, (level + 1) % dim, dim, result);
176 auto to_continue = (idx < dim) &&
177 (lower->
_coordinates.get()[idx] <= node->_hpnd->_coordinates.get()[idx]) &&
178 (upper->
_coordinates.get()[idx] >= node->_hpnd->_coordinates.get()[idx]);
187 result->push_back(node->_data);
192 if (upper->
_coordinates.get()[level] > node->_hpnd->_coordinates.get()[level])
193 SearchRange(lower, upper, node->_rght, (level + 1) % dim, dim, result);
208 template<
typename TData,
typename TValue>
228 size_t _tree_dimension;
229 size_t _tree_node_count;
233 std::vector<Ptr<CFEXPKDTreeNode<TData, TValue>>> _kd_tree_nodes;
235 std::vector<Ptr<CFEXPKDHyperNode<TValue>>> _kd_tree_hyper_nodes;
239 template<
typename TData>
245 template<
typename TData,
typename TValue>
251 template<
typename TData,
typename TValue>
256 container->IterateModElems([
this](
auto item)
264 template<
typename TData,
typename TValue>
270 CFEXPAsyncRunner::RunProcedureWithProgress([&]
273 result->CreateTopologyTree(container, opt_id);
279 template<
typename TData,
typename TValue>
285 auto array = data->GetCoordArray();
287 if (array.GetArrLength() != _tree_dimension)
288 FEXPCOMMON_EXCEPTION(
"Error: KD-tree: Try add data to tree with wrong coordinate dimension!!!");
291 _kd_tree_hyper_nodes.push_back(hyper_node);
298 template<
typename TData,
typename TValue>
306 template<
typename TData,
typename TValue>
311 size_t length1 = min_bound.size();
312 size_t length2 = max_bound.size();
313 if ((length1 != length2) || (length1 != _tree_dimension))
317 std::copy(min_bound.begin(), min_bound.end(), minb.get());
321 std::copy(max_bound.begin(), max_bound.end(), maxb.get());
330 #endif // !_CFEXPTOPOLOGIEKDTREE_H_ It represents a general node of a normed k-dimensional real space.
Definition: FEXPTopologieKDTree.h:20
#define IT
Definition: FEXPCommon.h:155
CFEXPKDTreeNode * _left
Definition: FEXPTopologieKDTree.h:132
It contains algorithm for building of a kd-tree data structure and it also process range queries...
Definition: FEXPTopologieKDTree.h:209
CFEXPKDTreeNode(CFEXPKDHyperNode< TValue > *hyp_node, Ptr< TData > &data)
Definition: FEXPTopologieKDTree.h:125
CFEXPTopologieKDTree(size_t dimension)
Definition: FEXPTopologieKDTree.h:246
#define FEXPCOMMON_FOREACH(start, end, index)
Definition: FEXPCommon.h:153
#define FEXPCOMMON_FOREACH_ITER_FNC(data, lambda_body)
Definition: FEXPCommon.h:157
Definition: FEXPCommon.h:276
std::vector< CFEXPKDTreeNode * > _same_nodes_data
Definition: FEXPTopologieKDTree.h:134
CFEXPKDHyperNode(size_t dimension)
Definition: FEXPTopologieKDTree.h:41
#define FEXPCOMMON_DEFAULT_INDX
Definition: FEXPCommon.h:171
#define FEXPCOMMON_EXCEPTION(error_text)
Definition: FEXPCommon.h:143
CFEXPKDHyperNode< TValue > * _hpnd
Definition: FEXPTopologieKDTree.h:131
#define FEXPCOMMON_COMPARE_EQ
Definition: FEXPCommon.h:1093
void CreateTopologyTree(Ptr< ICFEXPDataModelContIntf > container, size_t opt_id)
Definition: FEXPTopologieKDTree.h:253
static CFEXPKDTreeNode * InsertNode(CFEXPKDHyperNode< TValue > *hyp_nd, CFEXPKDTreeNode *node, Ptr< TData > &data, size_t level, size_t dim, std::vector< Ptr< CFEXPKDTreeNode< TData, TValue >>> &collect_tree_nodes)
Definition: FEXPTopologieKDTree.h:137
Ptr< TData > _data
Definition: FEXPTopologieKDTree.h:130
static Ptr< TType > SafeAllocInstance(VarArgs &&... inpar)
It allocates data.
Definition: FEXPCommon.h:392
virtual ~CFEXPTopologieKDTree()
Definition: FEXPTopologieKDTree.h:213
static Ptr< CFEXPTopologieKDTree< TData, TValue > > CreateTopologyTreeProgress(Ptr< ICFEXPDataModelContIntf > container, size_t dimension, size_t opt_id, std::string text)
Definition: FEXPTopologieKDTree.h:266
virtual ~CFEXPKDTreeNode()
Definition: FEXPTopologieKDTree.h:127
Base interface for system element.
Definition: FEXPDataContainer.h:28
bool operator==(const CFEXPKDHyperNode &to_compare)
Definition: FEXPTopologieKDTree.h:88
#define FEXPCOMMON_DEFAULT_VALUE
Definition: FEXPCommon.h:179
CFEXPKDTreeNode * _rght
Definition: FEXPTopologieKDTree.h:133
virtual ~CFEXPKDHyperNode()
Definition: FEXPTopologieKDTree.h:25
Definition: FEXPTopologieKDTree.h:116
Ptr< TValue > _coordinates
Definition: FEXPTopologieKDTree.h:27
Ptr< std::vector< Ptr< TData > > > GetNodesFromBoundingBox(const std::vector< TValue > &min_bound, const std::vector< TValue > &max_bound)
Definition: FEXPTopologieKDTree.h:308
static Ptr< TType > SafeAllocInstanceArray(size_t length)
It allocates data array.
Definition: FEXPCommon.h:410
Smart pointer.
Definition: FEXPCommon.h:274
size_t GetArrLength() const
Definition: FEXPCommon.h:296
#define FEXPCOMMON_DYNCAST(clsfrom, clsto, variable)
Definition: FEXPCommon.h:138
void InsertData(Ptr< TData > &data)
Definition: FEXPTopologieKDTree.h:280
TValue GetDistance(const CFEXPKDHyperNode &nd1, const CFEXPKDHyperNode &nd2)
Definition: FEXPTopologieKDTree.h:71
static void SearchRange(CFEXPKDHyperNode< TValue > *lower, CFEXPKDHyperNode< TValue > *upper, CFEXPKDTreeNode *node, size_t level, size_t dim, Ptr< std::vector< Ptr< TData >>> &result)
Definition: FEXPTopologieKDTree.h:164